package 中等.搜索.广度优先搜索;

/**
 * 给你一个由 '1'（陆地）和 '0'（水）组成的的二维网格，请你计算网格中岛屿的数量。
 * 岛屿总是被水包围，并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
 * 此外，你可以假设该网格的四条边均被水包围。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/number-of-islands
 */
public class 岛屿数量_200 {

    public static void main(String[] args) {

    }

    /**
     * 枚举每一个点，如果是陆地，将其相邻的陆地全部标记
     * 标记过的陆地不再累加，这里标记直接将陆地变成水
     */
    public int numIslands(char[][] grid) {
        int cnt = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                if (grid[i][j] == '1') {
                    cnt++;
                    dfs(grid, i, j);
                }
            }
        }
        return cnt;
    }

    private int[][] direction = new int[][]{{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

    private void dfs(char[][] grid, int i, int j) {
        grid[i][j] = '0';
        for (int[] direct : direction) {
            int nextI = direct[0] + i;
            int nextJ = direct[1] + j;
            if (nextI >= 0 && nextI < grid.length && nextJ >= 0 && nextJ < grid[0].length &&
                    grid[nextI][nextJ] == '1') {
                dfs(grid, nextI, nextJ);
            }
        }
    }

}
